


<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
  <meta charset="utf-8">
  
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  
  <title>torch.utils.cpp_extension &mdash; PyTorch master documentation</title>
  

  
  
  
  
    <link rel="canonical" href="https://pytorch.org/docs/stable/cpp_extension.html"/>
  

  

  
  
    

  

  <link rel="stylesheet" href="_static/css/theme.css" type="text/css" />
  <!-- <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> -->
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.10.0-beta/dist/katex.min.css" type="text/css" />
  <link rel="stylesheet" href="_static/css/jit.css" type="text/css" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/katex@0.11.1/dist/katex.min.css" type="text/css" />
  <link rel="stylesheet" href="_static/katex-math.css" type="text/css" />
    <link rel="index" title="Index" href="genindex.html" />
    <link rel="search" title="Search" href="search.html" />
    <link rel="next" title="torch.utils.data" href="data.html" />
    <link rel="prev" title="torch.utils.checkpoint" href="checkpoint.html" /> 

  
  <script src="_static/js/modernizr.min.js"></script>

  <!-- Preload the theme fonts -->

<link rel="preload" href="_static/fonts/FreightSans/freight-sans-book.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="_static/fonts/FreightSans/freight-sans-medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="_static/fonts/IBMPlexMono/IBMPlexMono-Medium.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="_static/fonts/FreightSans/freight-sans-bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="_static/fonts/FreightSans/freight-sans-medium-italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="_static/fonts/IBMPlexMono/IBMPlexMono-SemiBold.woff2" as="font" type="font/woff2" crossorigin="anonymous">

<!-- Preload the katex fonts -->

<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Math-Italic.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Main-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Main-Bold.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size1-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size4-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size2-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Size3-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
<link rel="preload" href="https://cdn.jsdelivr.net/npm/katex@0.10.0/dist/fonts/KaTeX_Caligraphic-Regular.woff2" as="font" type="font/woff2" crossorigin="anonymous">
</head>

<div class="container-fluid header-holder tutorials-header" id="header-holder">
  <div class="container">
    <div class="header-container">
      <a class="header-logo" href="https://pytorch.org/" aria-label="PyTorch"></a>

      <div class="main-menu">
        <ul>
          <li>
            <a href="https://pytorch.org/get-started">Get Started</a>
          </li>

          <li>
            <div class="ecosystem-dropdown">
              <a id="dropdownMenuButton" data-toggle="ecosystem-dropdown">
                Ecosystem
              </a>
              <div class="ecosystem-dropdown-menu">
                <a class="nav-dropdown-item" href="https://pytorch.org/hub"">
                  <span class=dropdown-title>Models (Beta)</span>
                  <p>Discover, publish, and reuse pre-trained models</p>
                </a>
                <a class="nav-dropdown-item" href="https://pytorch.org/ecosystem">
                  <span class=dropdown-title>Tools & Libraries</span>
                  <p>Explore the ecosystem of tools and libraries</p>
                </a>
              </div>
            </div>
          </li>

          <li>
            <a href="https://pytorch.org/mobile">Mobile</a>
          </li>

          <li>
            <a href="https://pytorch.org/blog/">Blog</a>
          </li>

          <li>
            <a href="https://pytorch.org/tutorials">Tutorials</a>
          </li>

          <li class="active">
            <a href="https://pytorch.org/docs/stable/index.html">Docs</a>
          </li>

          <li>
            <div class="resources-dropdown">
              <a id="resourcesDropdownButton" data-toggle="resources-dropdown">
                Resources
              </a>
              <div class="resources-dropdown-menu">
                <a class="nav-dropdown-item" href="https://pytorch.org/resources"">
                  <span class=dropdown-title>Developer Resources</span>
                  <p>Find resources and get questions answered</p>
                </a>
                <a class="nav-dropdown-item" href="https://pytorch.org/features">
                  <span class=dropdown-title>About</span>
                  <p>Learn about PyTorch’s features and capabilities</p>
                </a>
              </div>
            </div>
          </li>

          <li>
            <a href="https://github.com/pytorch/pytorch">Github</a>
          </li>
        </ul>
      </div>

      <a class="main-menu-open-button" href="#" data-behavior="open-mobile-menu"></a>
    </div>

  </div>
</div>


<body class="pytorch-body">

   

    

    <div class="table-of-contents-link-wrapper">
      <span>Table of Contents</span>
      <a href="#" class="toggle-table-of-contents" data-behavior="toggle-table-of-contents"></a>
    </div>

    <nav data-toggle="wy-nav-shift" class="pytorch-left-menu" id="pytorch-left-menu">
      <div class="pytorch-side-scroll">
        <div class="pytorch-menu pytorch-menu-vertical" data-spy="affix" role="navigation" aria-label="main navigation">
          <div class="pytorch-left-menu-search">
            

            
              
              
                <div class="version">
                  master (1.5.0 )
                </div>
              
            

            


  


<div role="search">
  <form id="rtd-search-form" class="wy-form" action="search.html" method="get">
    <input type="text" name="q" placeholder="Search Docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>

            
          </div>

          
<div>
  <a style="color:#F05732" href="https://pytorch.org/docs/stable/cpp_extension.html">
    You are viewing unstable developer preview docs.
    Click here to view docs for latest stable release.
  </a>
</div>

            
            
              
            
            
              <p class="caption"><span class="caption-text">Notes</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="notes/amp_examples.html">Automatic Mixed Precision examples</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/autograd.html">Autograd mechanics</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/broadcasting.html">Broadcasting semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/cpu_threading_torchscript_inference.html">CPU threading and TorchScript inference</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/cuda.html">CUDA semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/ddp.html">Distributed Data Parallel</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/extending.html">Extending PyTorch</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/faq.html">Frequently Asked Questions</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/large_scale_deployments.html">Features for large-scale deployments</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/multiprocessing.html">Multiprocessing best practices</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/randomness.html">Reproducibility</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/serialization.html">Serialization semantics</a></li>
<li class="toctree-l1"><a class="reference internal" href="notes/windows.html">Windows FAQ</a></li>
</ul>
<p class="caption"><span class="caption-text">Language Bindings</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="https://pytorch.org/cppdocs/">C++ API</a></li>
<li class="toctree-l1"><a class="reference internal" href="packages.html">Javadoc</a></li>
</ul>
<p class="caption"><span class="caption-text">Python API</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="torch.html">torch</a></li>
<li class="toctree-l1"><a class="reference internal" href="nn.html">torch.nn</a></li>
<li class="toctree-l1"><a class="reference internal" href="nn.functional.html">torch.nn.functional</a></li>
<li class="toctree-l1"><a class="reference internal" href="tensors.html">torch.Tensor</a></li>
<li class="toctree-l1"><a class="reference internal" href="tensor_attributes.html">Tensor Attributes</a></li>
<li class="toctree-l1"><a class="reference internal" href="tensor_view.html">Tensor Views</a></li>
<li class="toctree-l1"><a class="reference internal" href="autograd.html">torch.autograd</a></li>
<li class="toctree-l1"><a class="reference internal" href="cuda.html">torch.cuda</a></li>
<li class="toctree-l1"><a class="reference internal" href="amp.html">torch.cuda.amp</a></li>
<li class="toctree-l1"><a class="reference internal" href="distributed.html">torch.distributed</a></li>
<li class="toctree-l1"><a class="reference internal" href="distributions.html">torch.distributions</a></li>
<li class="toctree-l1"><a class="reference internal" href="hub.html">torch.hub</a></li>
<li class="toctree-l1"><a class="reference internal" href="jit.html">torch.jit</a></li>
<li class="toctree-l1"><a class="reference internal" href="nn.init.html">torch.nn.init</a></li>
<li class="toctree-l1"><a class="reference internal" href="onnx.html">torch.onnx</a></li>
<li class="toctree-l1"><a class="reference internal" href="optim.html">torch.optim</a></li>
<li class="toctree-l1"><a class="reference internal" href="quantization.html">Quantization</a></li>
<li class="toctree-l1"><a class="reference internal" href="rpc/index.html">Distributed RPC Framework</a></li>
<li class="toctree-l1"><a class="reference internal" href="random.html">torch.random</a></li>
<li class="toctree-l1"><a class="reference internal" href="sparse.html">torch.sparse</a></li>
<li class="toctree-l1"><a class="reference internal" href="storage.html">torch.Storage</a></li>
<li class="toctree-l1"><a class="reference internal" href="bottleneck.html">torch.utils.bottleneck</a></li>
<li class="toctree-l1"><a class="reference internal" href="checkpoint.html">torch.utils.checkpoint</a></li>
<li class="toctree-l1 current"><a class="current reference internal" href="#">torch.utils.cpp_extension</a></li>
<li class="toctree-l1"><a class="reference internal" href="data.html">torch.utils.data</a></li>
<li class="toctree-l1"><a class="reference internal" href="dlpack.html">torch.utils.dlpack</a></li>
<li class="toctree-l1"><a class="reference internal" href="model_zoo.html">torch.utils.model_zoo</a></li>
<li class="toctree-l1"><a class="reference internal" href="tensorboard.html">torch.utils.tensorboard</a></li>
<li class="toctree-l1"><a class="reference internal" href="type_info.html">Type Info</a></li>
<li class="toctree-l1"><a class="reference internal" href="named_tensor.html">Named Tensors</a></li>
<li class="toctree-l1"><a class="reference internal" href="name_inference.html">Named Tensors operator coverage</a></li>
<li class="toctree-l1"><a class="reference internal" href="__config__.html">torch.__config__</a></li>
</ul>
<p class="caption"><span class="caption-text">Libraries</span></p>
<ul>
<li class="toctree-l1"><a class="reference external" href="https://pytorch.org/audio">torchaudio</a></li>
<li class="toctree-l1"><a class="reference external" href="https://pytorch.org/text">torchtext</a></li>
<li class="toctree-l1"><a class="reference external" href="https://pytorch.org/elastic/">TorchElastic</a></li>
<li class="toctree-l1"><a class="reference external" href="https://pytorch.org/serve">TorchServe</a></li>
<li class="toctree-l1"><a class="reference external" href="http://pytorch.org/xla/">PyTorch on XLA Devices</a></li>
</ul>
<p class="caption"><span class="caption-text">Community</span></p>
<ul>
<li class="toctree-l1"><a class="reference internal" href="community/contribution_guide.html">PyTorch Contribution Guide</a></li>
<li class="toctree-l1"><a class="reference internal" href="community/governance.html">PyTorch Governance</a></li>
<li class="toctree-l1"><a class="reference internal" href="community/persons_of_interest.html">PyTorch Governance | Persons of Interest</a></li>
</ul>

            
          

        </div>
      </div>
    </nav>

    <div class="pytorch-container">
      <div class="pytorch-page-level-bar" id="pytorch-page-level-bar">
        <div class="pytorch-breadcrumbs-wrapper">
          















<div role="navigation" aria-label="breadcrumbs navigation">

  <ul class="pytorch-breadcrumbs">
    
      <li>
        <a href="index.html">
          
            Docs
          
        </a> &gt;
      </li>

        
      <li>torch.utils.cpp_extension</li>
    
    
      <li class="pytorch-breadcrumbs-aside">
        
            
            <a href="_sources/cpp_extension.rst.txt" rel="nofollow"><img src="_static/images/view-page-source-icon.svg"></a>
          
        
      </li>
    
  </ul>

  
</div>
        </div>

        <div class="pytorch-shortcuts-wrapper" id="pytorch-shortcuts-wrapper">
          Shortcuts
        </div>
      </div>

      <section data-toggle="wy-nav-shift" id="pytorch-content-wrap" class="pytorch-content-wrap">
        <div class="pytorch-content-left">

        
          
          <div class="rst-content">
          
            <div role="main" class="main-content" itemscope="itemscope" itemtype="http://schema.org/Article">
             <article itemprop="articleBody" id="pytorch-article" class="pytorch-article">
              
  <div class="section" id="torch-utils-cpp-extension">
<h1>torch.utils.cpp_extension<a class="headerlink" href="#torch-utils-cpp-extension" title="Permalink to this headline">¶</a></h1>
<dl class="function">
<dt id="torch.utils.cpp_extension.CppExtension">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">CppExtension</code><span class="sig-paren">(</span><em class="sig-param">name</em>, <em class="sig-param">sources</em>, <em class="sig-param">*args</em>, <em class="sig-param">**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#CppExtension"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.CppExtension" title="Permalink to this definition">¶</a></dt>
<dd><p>Creates a <code class="xref py py-class docutils literal notranslate"><span class="pre">setuptools.Extension</span></code> for C++.</p>
<p>Convenience method that creates a <code class="xref py py-class docutils literal notranslate"><span class="pre">setuptools.Extension</span></code> with the
bare minimum (but often sufficient) arguments to build a C++ extension.</p>
<p>All arguments are forwarded to the <code class="xref py py-class docutils literal notranslate"><span class="pre">setuptools.Extension</span></code>
constructor.</p>
<p class="rubric">Example</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">setuptools</span> <span class="kn">import</span> <span class="n">setup</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">torch.utils.cpp_extension</span> <span class="kn">import</span> <span class="n">BuildExtension</span><span class="p">,</span> <span class="n">CppExtension</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">setup</span><span class="p">(</span>
<span class="go">        name=&#39;extension&#39;,</span>
<span class="go">        ext_modules=[</span>
<span class="go">            CppExtension(</span>
<span class="go">                name=&#39;extension&#39;,</span>
<span class="go">                sources=[&#39;extension.cpp&#39;],</span>
<span class="go">                extra_compile_args=[&#39;-g&#39;]),</span>
<span class="go">        ],</span>
<span class="go">        cmdclass={</span>
<span class="go">            &#39;build_ext&#39;: BuildExtension</span>
<span class="go">        })</span>
</pre></div>
</div>
</dd></dl>

<dl class="function">
<dt id="torch.utils.cpp_extension.CUDAExtension">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">CUDAExtension</code><span class="sig-paren">(</span><em class="sig-param">name</em>, <em class="sig-param">sources</em>, <em class="sig-param">*args</em>, <em class="sig-param">**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#CUDAExtension"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.CUDAExtension" title="Permalink to this definition">¶</a></dt>
<dd><p>Creates a <code class="xref py py-class docutils literal notranslate"><span class="pre">setuptools.Extension</span></code> for CUDA/C++.</p>
<p>Convenience method that creates a <code class="xref py py-class docutils literal notranslate"><span class="pre">setuptools.Extension</span></code> with the
bare minimum (but often sufficient) arguments to build a CUDA/C++
extension. This includes the CUDA include path, library path and runtime
library.</p>
<p>All arguments are forwarded to the <code class="xref py py-class docutils literal notranslate"><span class="pre">setuptools.Extension</span></code>
constructor.</p>
<p class="rubric">Example</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">setuptools</span> <span class="kn">import</span> <span class="n">setup</span>
<span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">torch.utils.cpp_extension</span> <span class="kn">import</span> <span class="n">BuildExtension</span><span class="p">,</span> <span class="n">CUDAExtension</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">setup</span><span class="p">(</span>
<span class="go">        name=&#39;cuda_extension&#39;,</span>
<span class="go">        ext_modules=[</span>
<span class="go">            CUDAExtension(</span>
<span class="go">                    name=&#39;cuda_extension&#39;,</span>
<span class="go">                    sources=[&#39;extension.cpp&#39;, &#39;extension_kernel.cu&#39;],</span>
<span class="go">                    extra_compile_args={&#39;cxx&#39;: [&#39;-g&#39;],</span>
<span class="go">                                        &#39;nvcc&#39;: [&#39;-O2&#39;]})</span>
<span class="go">        ],</span>
<span class="go">        cmdclass={</span>
<span class="go">            &#39;build_ext&#39;: BuildExtension</span>
<span class="go">        })</span>
</pre></div>
</div>
</dd></dl>

<dl class="function">
<dt id="torch.utils.cpp_extension.BuildExtension">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">BuildExtension</code><span class="sig-paren">(</span><em class="sig-param">*args</em>, <em class="sig-param">**kwargs</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#BuildExtension"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.BuildExtension" title="Permalink to this definition">¶</a></dt>
<dd><p>A custom <code class="xref py py-mod docutils literal notranslate"><span class="pre">setuptools</span></code> build extension .</p>
<p>This <code class="xref py py-class docutils literal notranslate"><span class="pre">setuptools.build_ext</span></code> subclass takes care of passing the
minimum required compiler flags (e.g. <code class="docutils literal notranslate"><span class="pre">-std=c++14</span></code>) as well as mixed
C++/CUDA compilation (and support for CUDA files in general).</p>
<p>When using <a class="reference internal" href="#torch.utils.cpp_extension.BuildExtension" title="torch.utils.cpp_extension.BuildExtension"><code class="xref py py-class docutils literal notranslate"><span class="pre">BuildExtension</span></code></a>, it is allowed to supply a dictionary
for <code class="docutils literal notranslate"><span class="pre">extra_compile_args</span></code> (rather than the usual list) that maps from
languages (<code class="docutils literal notranslate"><span class="pre">cxx</span></code> or <code class="docutils literal notranslate"><span class="pre">nvcc</span></code>) to a list of additional compiler flags to
supply to the compiler. This makes it possible to supply different flags to
the C++ and CUDA compiler during mixed compilation.</p>
<p><code class="docutils literal notranslate"><span class="pre">use_ninja</span></code> (bool): If <code class="docutils literal notranslate"><span class="pre">use_ninja</span></code> is <code class="docutils literal notranslate"><span class="pre">True</span></code> (default), then we
attempt to build using the Ninja backend. Ninja greatly speeds up
compilation compared to the standard <code class="docutils literal notranslate"><span class="pre">setuptools.build_ext</span></code>.
Fallbacks to the standard distutils backend if Ninja is not available.</p>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>By default, the Ninja backend uses #CPUS + 2 workers to build the
extension. This may use up too many resources on some systems. One
can control the number of workers by setting the <cite>MAX_JOBS</cite> environment
variable to a non-negative number.</p>
</div>
</dd></dl>

<dl class="function">
<dt id="torch.utils.cpp_extension.load">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">load</code><span class="sig-paren">(</span><em class="sig-param">name</em>, <em class="sig-param">sources</em>, <em class="sig-param">extra_cflags=None</em>, <em class="sig-param">extra_cuda_cflags=None</em>, <em class="sig-param">extra_ldflags=None</em>, <em class="sig-param">extra_include_paths=None</em>, <em class="sig-param">build_directory=None</em>, <em class="sig-param">verbose=False</em>, <em class="sig-param">with_cuda=None</em>, <em class="sig-param">is_python_module=True</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#load"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.load" title="Permalink to this definition">¶</a></dt>
<dd><p>Loads a PyTorch C++ extension just-in-time (JIT).</p>
<p>To load an extension, a Ninja build file is emitted, which is used to
compile the given sources into a dynamic library. This library is
subsequently loaded into the current Python process as a module and
returned from this function, ready for use.</p>
<p>By default, the directory to which the build file is emitted and the
resulting library compiled to is <code class="docutils literal notranslate"><span class="pre">&lt;tmp&gt;/torch_extensions/&lt;name&gt;</span></code>, where
<code class="docutils literal notranslate"><span class="pre">&lt;tmp&gt;</span></code> is the temporary folder on the current platform and <code class="docutils literal notranslate"><span class="pre">&lt;name&gt;</span></code>
the name of the extension. This location can be overridden in two ways.
First, if the <code class="docutils literal notranslate"><span class="pre">TORCH_EXTENSIONS_DIR</span></code> environment variable is set, it
replaces <code class="docutils literal notranslate"><span class="pre">&lt;tmp&gt;/torch_extensions</span></code> and all extensions will be compiled
into subfolders of this directory. Second, if the <code class="docutils literal notranslate"><span class="pre">build_directory</span></code>
argument to this function is supplied, it overrides the entire path, i.e.
the library will be compiled into that folder directly.</p>
<p>To compile the sources, the default system compiler (<code class="docutils literal notranslate"><span class="pre">c++</span></code>) is used,
which can be overridden by setting the <code class="docutils literal notranslate"><span class="pre">CXX</span></code> environment variable. To pass
additional arguments to the compilation process, <code class="docutils literal notranslate"><span class="pre">extra_cflags</span></code> or
<code class="docutils literal notranslate"><span class="pre">extra_ldflags</span></code> can be provided. For example, to compile your extension
with optimizations, pass <code class="docutils literal notranslate"><span class="pre">extra_cflags=['-O3']</span></code>. You can also use
<code class="docutils literal notranslate"><span class="pre">extra_cflags</span></code> to pass further include directories.</p>
<p>CUDA support with mixed compilation is provided. Simply pass CUDA source
files (<code class="docutils literal notranslate"><span class="pre">.cu</span></code> or <code class="docutils literal notranslate"><span class="pre">.cuh</span></code>) along with other sources. Such files will be
detected and compiled with nvcc rather than the C++ compiler. This includes
passing the CUDA lib64 directory as a library directory, and linking
<code class="docutils literal notranslate"><span class="pre">cudart</span></code>. You can pass additional flags to nvcc via
<code class="docutils literal notranslate"><span class="pre">extra_cuda_cflags</span></code>, just like with <code class="docutils literal notranslate"><span class="pre">extra_cflags</span></code> for C++. Various
heuristics for finding the CUDA install directory are used, which usually
work fine. If not, setting the <code class="docutils literal notranslate"><span class="pre">CUDA_HOME</span></code> environment variable is the
safest option.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>name</strong> – The name of the extension to build. This MUST be the same as the
name of the pybind11 module!</p></li>
<li><p><strong>sources</strong> – A list of relative or absolute paths to C++ source files.</p></li>
<li><p><strong>extra_cflags</strong> – optional list of compiler flags to forward to the build.</p></li>
<li><p><strong>extra_cuda_cflags</strong> – optional list of compiler flags to forward to nvcc
when building CUDA sources.</p></li>
<li><p><strong>extra_ldflags</strong> – optional list of linker flags to forward to the build.</p></li>
<li><p><strong>extra_include_paths</strong> – optional list of include directories to forward
to the build.</p></li>
<li><p><strong>build_directory</strong> – optional path to use as build workspace.</p></li>
<li><p><strong>verbose</strong> – If <code class="docutils literal notranslate"><span class="pre">True</span></code>, turns on verbose logging of load steps.</p></li>
<li><p><strong>with_cuda</strong> – Determines whether CUDA headers and libraries are added to
the build. If set to <code class="docutils literal notranslate"><span class="pre">None</span></code> (default), this value is
automatically determined based on the existence of <code class="docutils literal notranslate"><span class="pre">.cu</span></code> or
<code class="docutils literal notranslate"><span class="pre">.cuh</span></code> in <code class="docutils literal notranslate"><span class="pre">sources</span></code>. Set it to <cite>True`</cite> to force CUDA headers
and libraries to be included.</p></li>
<li><p><strong>is_python_module</strong> – If <code class="docutils literal notranslate"><span class="pre">True</span></code> (default), imports the produced shared
library as a Python module. If <code class="docutils literal notranslate"><span class="pre">False</span></code>, loads it into the process
as a plain dynamic library.</p></li>
</ul>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>If <code class="docutils literal notranslate"><span class="pre">is_python_module</span></code> is <code class="docutils literal notranslate"><span class="pre">True</span></code>, returns the loaded PyTorch
extension as a Python module. If <code class="docutils literal notranslate"><span class="pre">is_python_module</span></code> is <code class="docutils literal notranslate"><span class="pre">False</span></code>
returns nothing (the shared library is loaded into the process as a side
effect).</p>
</dd>
</dl>
<p class="rubric">Example</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">torch.utils.cpp_extension</span> <span class="kn">import</span> <span class="n">load</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">module</span> <span class="o">=</span> <span class="n">load</span><span class="p">(</span>
<span class="go">        name=&#39;extension&#39;,</span>
<span class="go">        sources=[&#39;extension.cpp&#39;, &#39;extension_kernel.cu&#39;],</span>
<span class="go">        extra_cflags=[&#39;-O2&#39;],</span>
<span class="go">        verbose=True)</span>
</pre></div>
</div>
</dd></dl>

<dl class="function">
<dt id="torch.utils.cpp_extension.load_inline">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">load_inline</code><span class="sig-paren">(</span><em class="sig-param">name</em>, <em class="sig-param">cpp_sources</em>, <em class="sig-param">cuda_sources=None</em>, <em class="sig-param">functions=None</em>, <em class="sig-param">extra_cflags=None</em>, <em class="sig-param">extra_cuda_cflags=None</em>, <em class="sig-param">extra_ldflags=None</em>, <em class="sig-param">extra_include_paths=None</em>, <em class="sig-param">build_directory=None</em>, <em class="sig-param">verbose=False</em>, <em class="sig-param">with_cuda=None</em>, <em class="sig-param">is_python_module=True</em>, <em class="sig-param">with_pytorch_error_handling=True</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#load_inline"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.load_inline" title="Permalink to this definition">¶</a></dt>
<dd><p>Loads a PyTorch C++ extension just-in-time (JIT) from string sources.</p>
<p>This function behaves exactly like <a class="reference internal" href="#torch.utils.cpp_extension.load" title="torch.utils.cpp_extension.load"><code class="xref py py-func docutils literal notranslate"><span class="pre">load()</span></code></a>, but takes its sources as
strings rather than filenames. These strings are stored to files in the
build directory, after which the behavior of <a class="reference internal" href="#torch.utils.cpp_extension.load_inline" title="torch.utils.cpp_extension.load_inline"><code class="xref py py-func docutils literal notranslate"><span class="pre">load_inline()</span></code></a> is
identical to <a class="reference internal" href="#torch.utils.cpp_extension.load" title="torch.utils.cpp_extension.load"><code class="xref py py-func docutils literal notranslate"><span class="pre">load()</span></code></a>.</p>
<p>See <a class="reference external" href="https://github.com/pytorch/pytorch/blob/master/test/test_cpp_extensions.py">the
tests</a>
for good examples of using this function.</p>
<p>Sources may omit two required parts of a typical non-inline C++ extension:
the necessary header includes, as well as the (pybind11) binding code. More
precisely, strings passed to <code class="docutils literal notranslate"><span class="pre">cpp_sources</span></code> are first concatenated into a
single <code class="docutils literal notranslate"><span class="pre">.cpp</span></code> file. This file is then prepended with <code class="docutils literal notranslate"><span class="pre">#include</span>
<span class="pre">&lt;torch/extension.h&gt;</span></code>.</p>
<p>Furthermore, if the <code class="docutils literal notranslate"><span class="pre">functions</span></code> argument is supplied, bindings will be
automatically generated for each function specified. <code class="docutils literal notranslate"><span class="pre">functions</span></code> can
either be a list of function names, or a dictionary mapping from function
names to docstrings. If a list is given, the name of each function is used
as its docstring.</p>
<p>The sources in <code class="docutils literal notranslate"><span class="pre">cuda_sources</span></code> are concatenated into a separate <code class="docutils literal notranslate"><span class="pre">.cu</span></code>
file and  prepended with <code class="docutils literal notranslate"><span class="pre">torch/types.h</span></code>, <code class="docutils literal notranslate"><span class="pre">cuda.h</span></code> and
<code class="docutils literal notranslate"><span class="pre">cuda_runtime.h</span></code> includes. The <code class="docutils literal notranslate"><span class="pre">.cpp</span></code> and <code class="docutils literal notranslate"><span class="pre">.cu</span></code> files are compiled
separately, but ultimately linked into a single library. Note that no
bindings are generated for functions in <code class="docutils literal notranslate"><span class="pre">cuda_sources</span></code> per  se. To bind
to a CUDA kernel, you must create a C++ function that calls it, and either
declare or define this C++ function in one of the <code class="docutils literal notranslate"><span class="pre">cpp_sources</span></code> (and
include its name in <code class="docutils literal notranslate"><span class="pre">functions</span></code>).</p>
<p>See <a class="reference internal" href="#torch.utils.cpp_extension.load" title="torch.utils.cpp_extension.load"><code class="xref py py-func docutils literal notranslate"><span class="pre">load()</span></code></a> for a description of arguments omitted below.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><ul class="simple">
<li><p><strong>cpp_sources</strong> – A string, or list of strings, containing C++ source code.</p></li>
<li><p><strong>cuda_sources</strong> – A string, or list of strings, containing CUDA source code.</p></li>
<li><p><strong>functions</strong> – A list of function names for which to generate function
bindings. If a dictionary is given, it should map function names to
docstrings (which are otherwise just the function names).</p></li>
<li><p><strong>with_cuda</strong> – Determines whether CUDA headers and libraries are added to
the build. If set to <code class="docutils literal notranslate"><span class="pre">None</span></code> (default), this value is
automatically determined based on whether <code class="docutils literal notranslate"><span class="pre">cuda_sources</span></code> is
provided. Set it to <code class="docutils literal notranslate"><span class="pre">True</span></code> to force CUDA headers
and libraries to be included.</p></li>
<li><p><strong>with_pytorch_error_handling</strong> – Determines whether pytorch error and
warning macros are handled by pytorch instead of pybind. To do
this, each function <code class="docutils literal notranslate"><span class="pre">foo</span></code> is called via an intermediary <code class="docutils literal notranslate"><span class="pre">_safe_foo</span></code>
function. This redirection might cause issues in obscure cases
of cpp. This flag should be set to <code class="docutils literal notranslate"><span class="pre">False</span></code> when this redirect
causes issues.</p></li>
</ul>
</dd>
</dl>
<p class="rubric">Example</p>
<div class="doctest highlight-default notranslate"><div class="highlight"><pre><span></span><span class="gp">&gt;&gt;&gt; </span><span class="kn">from</span> <span class="nn">torch.utils.cpp_extension</span> <span class="kn">import</span> <span class="n">load_inline</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">source</span> <span class="o">=</span> <span class="s1">&#39;&#39;&#39;</span>
<span class="go">at::Tensor sin_add(at::Tensor x, at::Tensor y) {</span>
<span class="go">  return x.sin() + y.sin();</span>
<span class="go">}</span>
<span class="go">&#39;&#39;&#39;</span>
<span class="gp">&gt;&gt;&gt; </span><span class="n">module</span> <span class="o">=</span> <span class="n">load_inline</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="s1">&#39;inline_extension&#39;</span><span class="p">,</span>
<span class="go">                         cpp_sources=[source],</span>
<span class="go">                         functions=[&#39;sin_add&#39;])</span>
</pre></div>
</div>
<div class="admonition note">
<p class="admonition-title">Note</p>
<p>By default, the Ninja backend uses #CPUS + 2 workers to build the
extension. This may use up too many resources on some systems. One
can control the number of workers by setting the <cite>MAX_JOBS</cite> environment
variable to a non-negative number.</p>
</div>
</dd></dl>

<dl class="function">
<dt id="torch.utils.cpp_extension.include_paths">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">include_paths</code><span class="sig-paren">(</span><em class="sig-param">cuda=False</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#include_paths"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.include_paths" title="Permalink to this definition">¶</a></dt>
<dd><p>Get the include paths required to build a C++ or CUDA extension.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>cuda</strong> – If <cite>True</cite>, includes CUDA-specific include paths.</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>A list of include path strings.</p>
</dd>
</dl>
</dd></dl>

<dl class="function">
<dt id="torch.utils.cpp_extension.check_compiler_abi_compatibility">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">check_compiler_abi_compatibility</code><span class="sig-paren">(</span><em class="sig-param">compiler</em><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#check_compiler_abi_compatibility"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.check_compiler_abi_compatibility" title="Permalink to this definition">¶</a></dt>
<dd><p>Verifies that the given compiler is ABI-compatible with PyTorch.</p>
<dl class="field-list simple">
<dt class="field-odd">Parameters</dt>
<dd class="field-odd"><p><strong>compiler</strong> (<a class="reference external" href="https://docs.python.org/3/library/stdtypes.html#str" title="(in Python v3.8)"><em>str</em></a>) – The compiler executable name to check (e.g. <code class="docutils literal notranslate"><span class="pre">g++</span></code>).
Must be executable in a shell process.</p>
</dd>
<dt class="field-even">Returns</dt>
<dd class="field-even"><p>False if the compiler is (likely) ABI-incompatible with PyTorch,
else True.</p>
</dd>
</dl>
</dd></dl>

<dl class="function">
<dt id="torch.utils.cpp_extension.verify_ninja_availability">
<code class="sig-prename descclassname">torch.utils.cpp_extension.</code><code class="sig-name descname">verify_ninja_availability</code><span class="sig-paren">(</span><span class="sig-paren">)</span><a class="reference internal" href="_modules/torch/utils/cpp_extension.html#verify_ninja_availability"><span class="viewcode-link">[source]</span></a><a class="headerlink" href="#torch.utils.cpp_extension.verify_ninja_availability" title="Permalink to this definition">¶</a></dt>
<dd><p>Returns <code class="docutils literal notranslate"><span class="pre">True</span></code> if the <a class="reference external" href="https://ninja-build.org/">ninja</a> build system is
available on the system.</p>
</dd></dl>

</div>


             </article>
             
            </div>
            <footer>
  
    <div class="rst-footer-buttons" role="navigation" aria-label="footer navigation">
      
        <a href="data.html" class="btn btn-neutral float-right" title="torch.utils.data" accesskey="n" rel="next">Next <img src="_static/images/chevron-right-orange.svg" class="next-page"></a>
      
      
        <a href="checkpoint.html" class="btn btn-neutral" title="torch.utils.checkpoint" accesskey="p" rel="prev"><img src="_static/images/chevron-right-orange.svg" class="previous-page"> Previous</a>
      
    </div>
  

  

    <hr>

  

  <div role="contentinfo">
    <p>
        &copy; Copyright 2019, Torch Contributors.

    </p>
  </div>
    
      <div>
        Built with <a href="http://sphinx-doc.org/">Sphinx</a> using a <a href="https://github.com/rtfd/sphinx_rtd_theme">theme</a> provided by <a href="https://readthedocs.org">Read the Docs</a>.
      </div>
     

</footer>

          </div>
        </div>

        <div class="pytorch-content-right" id="pytorch-content-right">
          <div class="pytorch-right-menu" id="pytorch-right-menu">
            <div class="pytorch-side-scroll" id="pytorch-side-scroll-right">
              <ul>
<li><a class="reference internal" href="#">torch.utils.cpp_extension</a></li>
</ul>

            </div>
          </div>
        </div>
      </section>
    </div>

  


  

     
       <script type="text/javascript" id="documentation_options" data-url_root="./" src="_static/documentation_options.js"></script>
         <script src="_static/jquery.js"></script>
         <script src="_static/underscore.js"></script>
         <script src="_static/doctools.js"></script>
         <script src="_static/language_data.js"></script>
     

  

  <script type="text/javascript" src="_static/js/vendor/popper.min.js"></script>
  <script type="text/javascript" src="_static/js/vendor/bootstrap.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/list.js/1.5.0/list.min.js"></script>
  <script type="text/javascript" src="_static/js/theme.js"></script>

  <script type="text/javascript">
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script>
 
<script>
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-90545585-1', 'auto');
  ga('send', 'pageview');

</script>

<script async src="https://www.googletagmanager.com/gtag/js?id=UA-117752657-2"></script>

<script>
  window.dataLayer = window.dataLayer || [];

  function gtag(){dataLayer.push(arguments);}

  gtag('js', new Date());
  gtag('config', 'UA-117752657-2');
</script>

<img height="1" width="1" style="border-style:none;" alt="" src="https://www.googleadservices.com/pagead/conversion/795629140/?label=txkmCPmdtosBENSssfsC&amp;guid=ON&amp;script=0"/>


  <!-- Begin Footer -->

  <div class="container-fluid docs-tutorials-resources" id="docs-tutorials-resources">
    <div class="container">
      <div class="row">
        <div class="col-md-4 text-center">
          <h2>Docs</h2>
          <p>Access comprehensive developer documentation for PyTorch</p>
          <a class="with-right-arrow" href="https://pytorch.org/docs/stable/index.html">View Docs</a>
        </div>

        <div class="col-md-4 text-center">
          <h2>Tutorials</h2>
          <p>Get in-depth tutorials for beginners and advanced developers</p>
          <a class="with-right-arrow" href="https://pytorch.org/tutorials">View Tutorials</a>
        </div>

        <div class="col-md-4 text-center">
          <h2>Resources</h2>
          <p>Find development resources and get your questions answered</p>
          <a class="with-right-arrow" href="https://pytorch.org/resources">View Resources</a>
        </div>
      </div>
    </div>
  </div>

  <footer class="site-footer">
    <div class="container footer-container">
      <div class="footer-logo-wrapper">
        <a href="https://pytorch.org/" class="footer-logo"></a>
      </div>

      <div class="footer-links-wrapper">
        <div class="footer-links-col">
          <ul>
            <li class="list-title"><a href="https://pytorch.org/">PyTorch</a></li>
            <li><a href="https://pytorch.org/get-started">Get Started</a></li>
            <li><a href="https://pytorch.org/features">Features</a></li>
            <li><a href="https://pytorch.org/ecosystem">Ecosystem</a></li>
            <li><a href="https://pytorch.org/blog/">Blog</a></li>
            <li><a href="https://github.com/pytorch/pytorch/blob/master/CONTRIBUTING.md">Contributing</a></li>
          </ul>
        </div>

        <div class="footer-links-col">
          <ul>
            <li class="list-title"><a href="https://pytorch.org/resources">Resources</a></li>
            <li><a href="https://pytorch.org/tutorials">Tutorials</a></li>
            <li><a href="https://pytorch.org/docs/stable/index.html">Docs</a></li>
            <li><a href="https://discuss.pytorch.org" target="_blank">Discuss</a></li>
            <li><a href="https://github.com/pytorch/pytorch/issues" target="_blank">Github Issues</a></li>
            <li><a href="https://pytorch.org/assets/brand-guidelines/PyTorch-Brand-Guidelines.pdf" target="_blank">Brand Guidelines</a></li>
          </ul>
        </div>

        <div class="footer-links-col follow-us-col">
          <ul>
            <li class="list-title">Stay Connected</li>
            <li>
              <div id="mc_embed_signup">
                <form
                  action="https://twitter.us14.list-manage.com/subscribe/post?u=75419c71fe0a935e53dfa4a3f&id=91d0dccd39"
                  method="post"
                  id="mc-embedded-subscribe-form"
                  name="mc-embedded-subscribe-form"
                  class="email-subscribe-form validate"
                  target="_blank"
                  novalidate>
                  <div id="mc_embed_signup_scroll" class="email-subscribe-form-fields-wrapper">
                    <div class="mc-field-group">
                      <label for="mce-EMAIL" style="display:none;">Email Address</label>
                      <input type="email" value="" name="EMAIL" class="required email" id="mce-EMAIL" placeholder="Email Address">
                    </div>

                    <div id="mce-responses" class="clear">
                      <div class="response" id="mce-error-response" style="display:none"></div>
                      <div class="response" id="mce-success-response" style="display:none"></div>
                    </div>    <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->

                    <div style="position: absolute; left: -5000px;" aria-hidden="true"><input type="text" name="b_75419c71fe0a935e53dfa4a3f_91d0dccd39" tabindex="-1" value=""></div>

                    <div class="clear">
                      <input type="submit" value="" name="subscribe" id="mc-embedded-subscribe" class="button email-subscribe-button">
                    </div>
                  </div>
                </form>
              </div>

            </li>
          </ul>

          <div class="footer-social-icons">
            <a href="https://www.facebook.com/pytorch" target="_blank" class="facebook"></a>
            <a href="https://twitter.com/pytorch" target="_blank" class="twitter"></a>
            <a href="https://www.youtube.com/pytorch" target="_blank" class="youtube"></a>
          </div>
        </div>
      </div>
    </div>
  </footer>

  <div class="cookie-banner-wrapper">
  <div class="container">
    <p class="gdpr-notice">To analyze traffic and optimize your experience, we serve cookies on this site. By clicking or navigating, you agree to allow our usage of cookies. As the current maintainers of this site, Facebook’s Cookies Policy applies. Learn more, including about available controls: <a href="https://www.facebook.com/policies/cookies/">Cookies Policy</a>.</p>
    <img class="close-button" src="_static/images/pytorch-x.svg">
  </div>
</div>

  <!-- End Footer -->

  <!-- Begin Mobile Menu -->

  <div class="mobile-main-menu">
    <div class="container-fluid">
      <div class="container">
        <div class="mobile-main-menu-header-container">
          <a class="header-logo" href="https://pytorch.org/" aria-label="PyTorch"></a>
          <a class="main-menu-close-button" href="#" data-behavior="close-mobile-menu"></a>
        </div>
      </div>
    </div>

    <div class="mobile-main-menu-links-container">
      <div class="main-menu">
        <ul>
          <li>
            <a href="https://pytorch.org/get-started">Get Started</a>
          </li>

          <li>
            <a href="https://pytorch.org/features">Features</a>
          </li>

          <li>
            <a href="https://pytorch.org/ecosystem">Ecosystem</a>
          </li>

          <li>
            <a href="https://pytorch.org/mobile">Mobile</a>
          </li>

          <li>
            <a href="https://pytorch.org/hub">PyTorch Hub</a>
          </li>

          <li>
            <a href="https://pytorch.org/blog/">Blog</a>
          </li>

          <li>
            <a href="https://pytorch.org/tutorials">Tutorials</a>
          </li>

          <li class="active">
            <a href="https://pytorch.org/docs/stable/index.html">Docs</a>
          </li>

          <li>
            <a href="https://pytorch.org/resources">Resources</a>
          </li>

          <li>
            <a href="https://github.com/pytorch/pytorch">Github</a>
          </li>
        </ul>
      </div>
    </div>
  </div>

  <!-- End Mobile Menu -->

  <script type="text/javascript" src="_static/js/vendor/anchor.min.js"></script>

  <script type="text/javascript">
    $(document).ready(function() {
      mobileMenu.bind();
      mobileTOC.bind();
      pytorchAnchors.bind();
      sideMenus.bind();
      scrollToAnchor.bind();
      highlightNavigation.bind();
      mainMenuDropdown.bind();
      filterTags.bind();

      // Remove any empty p tags that Sphinx adds
      $("[data-tags='null']").remove();

      // Add class to links that have code blocks, since we cannot create links in code blocks
      $("article.pytorch-article a span.pre").each(function(e) {
        $(this).closest("a").addClass("has-code");
      });
    })
  </script>
</body>
</html>